import os

# 导入必要模块
import os
# 导入配置管理器
from utils.config_utils import get_db_config, get_oss_config, set_config_env

class Config:
    # Flask配置
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-secret-key'

    # 文件存储配置
    TEMP_DIR = 'download'
    OUTPUT_DIR = 'output'

    # 最大并发处理任务数
    MAX_CONCURRENT_TASKS = 5

    # 请求超时设置（秒）
    REQUEST_TIMEOUT = 30

    # 重试配置
    MAX_RETRIES = 3
    RETRY_DELAY = 5  # 重试间隔（秒）

    # 日志配置
    LOG_LEVEL = 'INFO'
    LOG_FILE = 'app.log'

    # MoviePy配置
    MOVIEPY_THREADS = 4

    # 根据当前环境获取数据库配置
    @property
    def DB_CONFIG(self):
        return get_db_config()

    # 根据当前环境获取OSS配置
    @property
    def OSS_CONFIG(self):
        return get_oss_config()

    @staticmethod
    def init_app(app):
        # 获取OSS配置（新的不区分环境的配置格式）
        oss_config = get_oss_config()
        
        # 设置默认使用alioss_bucket中的public配置
        if 'alioss_bucket' in oss_config and 'public' in oss_config['alioss_bucket']:
            app.config['OSS_CONFIG'] = oss_config['alioss_bucket']['public']
        else:
            # 如果没有找到alioss_bucket配置，使用整个配置
            app.config['OSS_CONFIG'] = oss_config

        # 数据库配置现在基于数据库名称而不是环境
        # 默认使用freefishchn数据库
        db_name = os.environ.get('DB_NAME', 'freefishchn')
        app.config['DB_CONFIG'] = get_db_config(db_name)

        # 确保临时目录存在
        os.makedirs(app.config.get('TEMP_DIR', 'temp'), exist_ok=True)
        os.makedirs(app.config.get('OUTPUT_DIR', 'output'), exist_ok=True)

class DevelopmentConfig(Config):
    DEBUG = True
    LOG_LEVEL = 'DEBUG'
    ENV = 'development'  # 显式设置ENV属性
    
class ProductionConfig(Config):
    DEBUG = False
    SECRET_KEY = os.environ.get('SECRET_KEY')
    ENV = 'production'  # 显式设置ENV属性
    
class TestConfig(Config):
    DEBUG = True
    TESTING = True
    MAX_CONCURRENT_TASKS = 2
    REQUEST_TIMEOUT = 10
    ENV = 'test'  # 显式设置ENV属性
    
config = {
    'development': DevelopmentConfig,
    'production': ProductionConfig,
    'test': TestConfig
}